﻿/**
 * @file LiteBase.cpp
 * 응용 프로그램에 대한 클래스 cpp 파일 입니다.
*/

#include "stdafx.h"
#include "afxwinappex.h"
#include "LiteBase.h"
#include "MainFrm.h"
#include "Globalvf.h"

#include "LiteBaseDoc.h"
#include "LiteBaseView.h"
#include "eng_type.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

BEGIN_MESSAGE_MAP(CLiteBaseApp, CWinApp)   
	ON_COMMAND(ID_APP_ABOUT, &CLiteBaseApp::OnAppAbout)
	// 표준 파일을 기초로 하는 문서 명령입니다.
	ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
END_MESSAGE_MAP()


// CLiteBaseApp 생성
/**
 @brief 기본 생성자로 아무런 작업 없음.
*/
CLiteBaseApp::CLiteBaseApp()
{

	// TODO: 여기에 생성 코드를 추가합니다.
	// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}

// 유일한 CLiteBaseApp 개체입니다.
CLiteBaseApp theApp;/**< Class 변수 Main Warpper 변수 */

// CLiteBaseApp 초기화
/**
* @brief Application 인스턴스 수행 작업 
\n 1) 환경 읽기. 
\n 2) Tray Icon 처리.
*/
BOOL CLiteBaseApp::InitInstance()
{
	// 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
	// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다. 
	// InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다.
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록
	// 이 항목을 설정하십시오.
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();
	
	if (!AfxSocketInit())
	{
		AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
		return FALSE;
	}

	// OLE 라이브러리를 초기화합니다.
	if (!AfxOleInit())
	{
		AfxMessageBox(IDP_OLE_INIT_FAILED);
		return FALSE;
	}
	AfxEnableControlContainer();
	// 표준 초기화
	// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
	// 아래에서 필요 없는 특정 초기화
	// 루틴을 제거해야 합니다.
	// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
	// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
	// 적절한 내용으로 수정해야 합니다.
	SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));
	LoadStdProfileSettings(4);  // MRU를 포함하여 표준 INI 파일 옵션을 로드합니다.

	// 응용 프로그램의 문서 템플릿을 등록합니다. 문서 템플릿은
	//  문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다.
	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CLiteBaseDoc),
		RUNTIME_CLASS(CMainFrame),       // 주 SDI 프레임 창입니다.
		RUNTIME_CLASS(CLiteBaseView));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);


	// 표준 셸 명령, DDE, 파일 열기에 대한 명령줄을 구문 분석합니다.
	CCommandLineInfo cmdInfo;
	//ParseCommandLine(cmdInfo);
	//==================================================
	// 환경 읽기.==>환경 파일 읽기가 실패 하면, 리턴 한다.
	//==================================================
	if( FALSE ==ReadEnv())
	{
		AfxMessageBox(_T("Fail to read ini file"));
		return FALSE;
	}
	// 명령줄에 지정된 명령을 디스패치합니다.
	// 응용 프로그램이 /RegServer, /Register, /Unregserver 또는 /Unregister로 시작된 경우 FALSE를 반환합니다.
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;
	// 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.
	m_pMainWnd->ShowWindow(SW_HIDE);
	m_pMainWnd->UpdateWindow();
	// 접미사가 있을 경우에만 DragAcceptFiles를 호출합니다.
	//  SDI 응용 프로그램에서는 ProcessShellCommand 후에 이러한 호출이 발생해야 합니다.
	//==================================================
	// Tray Icon 처리.
	//==================================================
	NOTIFYICONDATA nid;
	nid.cbSize = sizeof(nid);
	nid.hWnd = m_pMainWnd->m_hWnd;    //트레이아이콘과 통신할 윈도우 핸들
	nid.uID = IDR_MAINFRAME;   //트레이아이콘의 리소스ID(Data측면)
	nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
	nid.uCallbackMessage = UM_TRAYICON; //트레이아이콘의 메시지가 수신시 수신윈도우가 처리할 메시지
	nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//아이콘리소스(UI측면)
	lstrcpy(nid.szTip,_T("리포트DB서버")); // 툴팁
	// taskBar상태영역에 아이콘 추가,삭제,수정할때 시스템에 메시지 전달
	Shell_NotifyIcon(NIM_ADD,&nid); //구조체내용으로 트레이아이콘을 등록한다.(Data측면)
	m_pMainWnd->SendMessage(WM_SETICON,(WPARAM)TRUE,(LPARAM)nid.hIcon);//트레이화면에 붙이기(UI측면)
	//==================================================
	// 끝.
	//==================================================
	return TRUE;
}

/**
 @class CLiteBaseApp
 @brief 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
 @date   2012-02-08 18:11:09
 @author  nabidream@gmail.com
*/
class CAboutDlg : public CDialog
{
public:
	CAboutDlg(); ///< 생성자.

// 대화 상자 데이터입니다.
	enum { IDD = IDD_ABOUTBOX };

protected:
	virtual void DoDataExchange(CDataExchange* pDX); ///< DDX/DDV 지원입니다.

// 구현입니다.
protected:
	DECLARE_MESSAGE_MAP() ///< Message Map 정의.
};

// CAbountDlg 초기화
/**
* @brief Abount Dialog 초기화 
\n 초기화 이외에 어떤 작없도 없다. 
*/
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

// DDX 디폴트 함수 호출
/**
* @brief DDX 정의
\n 초기화 이외에 어떤 작없도 없다. 
*/
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// DDX 디폴트 함수 호출
/**
* @brief 대화 상자를 실행하기 위한 응용 프로그램 명령입니다.
* \n 초기화 이외에 어떤 작없도 없다. 
*/
void CLiteBaseApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}
